﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EstoqueUnifeiADO.Dados;
using System.Data;
using System.Drawing;
using System.Reflection;

namespace EstoqueUnifeiADO
{
    public partial class frmTipoProduto : System.Web.UI.Page
    {
        protected string GrupoDeValidacao { get { return "frm" + this.ClientID; } }
        protected void AddError(String Erro, string validationGroup)
        {
            this.Page.Validators.Add(new CustomValidator()
            {
                IsValid = false,
                ErrorMessage = Erro,
                Display = ValidatorDisplay.Dynamic,
                ValidationGroup = string.IsNullOrEmpty(validationGroup) ? this.GrupoDeValidacao : validationGroup

            });
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                InitView();

            vsform.ValidationGroup = GrupoDeValidacao;

        }
        protected void InitView()
        {
            trvTipo.Nodes.Clear();
            dsTipoProduto.TIPODataTable dt = ((odsView.Select() as DataView).Table as dsTipoProduto.TIPODataTable);
            var somenteParent = dt.Where(x => x.IsPARENTTIPONull());
            foreach (var item in somenteParent)
            {
                trvTipo.Nodes.Add(GetChilds(dt, item));
            }

        }
        protected TreeNode GetChilds(dsTipoProduto.TIPODataTable dt,
            dsTipoProduto.TIPORow parent)
        {
            var childs = dt.Where(x => !x.IsPARENTTIPONull() && x.PARENTTIPO.Equals(parent.CODTIPO));
            TreeNode node = new TreeNode(parent.TIPODESCRICAO, parent.CODTIPO.ToString());
            foreach (var item in childs)
            {
                node.ChildNodes.Add(GetChilds(dt, item));
            }
            return node;
        }

        protected void trvTipo_SelectedNodeChanged(object sender, EventArgs e)
        {
            hfKey.Value = trvTipo.SelectedNode.Value;
            if (fvTipo.CurrentMode == FormViewMode.ReadOnly)
                fvTipo.DataBind();

        }

        protected void AdicionarRaiz(object sender, ImageClickEventArgs e)
        {
            if (fvTipo.CurrentMode == FormViewMode.ReadOnly)
            {
                hfParent.Value = string.Empty;
                fvTipo.ChangeMode(FormViewMode.Insert);
                
               
            }


        }
        protected void AdicionarFilho(object sender, ImageClickEventArgs e)
        {
            if (trvTipo.SelectedNode == null)
            {
                AddError("Você deve selecionar um item para adicionar um nó filho", (GrupoDeValidacao));
            
            }
            else 
            {
                hfParent.Value = trvTipo.SelectedNode.Value;
                fvTipo.ChangeMode(FormViewMode.Insert);
            }


        }
        protected void ExcluirNo(object sender, ImageClickEventArgs e)
        {
            if (trvTipo.SelectedNode == null)
            {
                AddError("Você deve selecionar um item para excluir", (GrupoDeValidacao));
            }
            else
            {
                fvTipo.DeleteItem();
            }




        }

        protected void fvTipo_ItemDeleted(object sender, FormViewDeletedEventArgs e)
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
                Exception ex = e.Exception.InnerException == null ? e.Exception : e.Exception.InnerException;
                AddError("Ocorreu o seguinte erro ao tentar  excluir o registro:" + ex.Message, null);

            }
            else
                trvTipo.Nodes.Remove(trvTipo.SelectedNode);//InitView();
           

        }

        protected void fvTipo_ItemInserted(object sender, FormViewInsertedEventArgs e)
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true;
                Exception ex = e.Exception.InnerException == null ? e.Exception : e.Exception.InnerException;
                AddError("Ocorreu o seguinte erro ao tentar  inserir o registro:" + ex.Message, null);

            }
            else
                 InitView();
        }

        protected void fvTipo_ItemUpdated(object sender, FormViewUpdatedEventArgs e) 
        {
            if (e.Exception != null)
            {
                e.ExceptionHandled = true; 
                Exception ex = e.Exception.InnerException == null ? e.Exception : e.Exception.InnerException;
                AddError("Ocorreu o seguinte erro ao tentar  atualizar o registro:" + ex.Message, null);

            }
            else
                InitView();
        }


        private void SetFormValidationSummary (ControlCollection controles )
        {
            

            foreach (Control item in controles)
            {
                if (item is BaseValidator) 
                {
                    ((BaseValidator)item).Text = "*";
                    ((BaseValidator)item).ForeColor = Color.Red;
                    ((BaseValidator)item).Display =ValidatorDisplay.Dynamic;
                    ((BaseValidator)item).ToolTip = ((BaseValidator)item).ErrorMessage;
                }
                PropertyInfo campo = item.GetType().GetProperty("ValidationGroup");
                if (campo != null)
                    if (campo.CanWrite)
                        campo.SetValue(item, (GrupoDeValidacao), null);
                if (item.Controls.Count > 0)
                    SetFormValidationSummary(item.Controls);

            }

        }

        protected void fvTipo_DataBound(object sender, EventArgs e)
        {
            if (fvTipo.CurrentMode == FormViewMode.Insert || fvTipo.CurrentMode == FormViewMode.Edit)
                SetFormValidationSummary(fvTipo.Row.Controls);
        }
        
    }
}